/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package bs.stock.rn;

import bs.stock.dao.StockDAO;
import bs.stock.modelo.Deposito;
import bs.stock.modelo.ItemMovimientoStock;
import bs.stock.modelo.Producto;
import bs.stock.modelo.Stock;
import bs.stock.modelo.StockPK;
import bs.stock.vistas.StockProductoDeposito;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import javax.ejb.EJB;
import javax.ejb.Stateless;

/**
 *
 * @author Claudio
 */
@Stateless
public class StockRN implements Serializable {

    @EJB private StockDAO stockDAO;

    public synchronized void guardar(Stock stock) throws Exception{
        
        Stock stockAux = getStock(stock);
             
        if(stockAux==null){
            stockDAO.crear(stock);
        }else{
           stockAux.setStocks(stockAux.getStocks().add(stock.getStocks()));
           stockDAO.editar(stockAux);
        }
    }

    public Stock nuevoStock(ItemMovimientoStock i){

        Stock s = new Stock(i);

        if(i.getProducto().getDefineSerie().equals("N")){
            s.setNserie("");
        }
        return s;
    }

    public Stock getStock(Stock stock){

        StockPK idPK = new StockPK(stock.getCodigo(), stock.getNserie(), stock.getEnvase(), stock.getNdespa(), stock.getNotros(), stock.getNfecha(), stock.getNatrib(), stock.getNubica(), stock.getNestan(), stock.getDeposito());
        return stockDAO.getObjeto(Stock.class, idPK);
    }

    public boolean isProductoDisponible(Stock s){

        BigDecimal disp = stockDAO.getDisponibleProducto(s);
        BigDecimal cant = s.getStocks().add(BigDecimal.ZERO);

        if(disp==null){
//            System.out.println("Producto sin stock en "+ s.getDeposi());
            return false;
        }

        //System.err.println("Producto:" + s + "Cantidad: " + cant  + " Disp:" + disp );

        if(cant.compareTo(BigDecimal.ZERO)>0){
            //System.err.println("El stock positivo: " + cant);
            cant = cant.negate();
        }

//        System.err.println("Stock resultante: " +disp.add(cant));

        //Si el stock resultante es menor a cero no pasa
        if(disp.add(cant).compareTo(BigDecimal.ZERO)==-1){
            return false;
        }

        return true;
    }

    public Stock getStock(StockPK idPK){

        return stockDAO.getObjeto(Stock.class, idPK);
    }

    public List<StockProductoDeposito> verStockPorProducto(Producto p) {

        return stockDAO.verStockPorProducto(p);
    }

    public List<StockProductoDeposito> verStockPorDeposito(Deposito d) {

        return stockDAO.verStockPorDeposito(d);
    }

    public List<Stock> getStockByProductoDeposito(Producto p,Deposito d){
        return stockDAO.getStockByProductoDeposito(p, d);
    }

    public BigDecimal getStockAFecha(Producto p,Deposito d, Date fecha){
        return stockDAO.getStockAFecha(p,d,fecha);
    }

    public List<ItemMovimientoStock> getMovimientosEntreFechas(Producto p,Deposito d, Date fDesde,Date fHasta){

        return stockDAO.getMovimientosEntreFechas(p,d,fDesde,fHasta);
    }
}
